package com.bzg.baseSpringComponent.orderComparator;

import org.springframework.core.OrderComparator;
import org.springframework.core.annotation.AnnotationAwareOrderComparator;

import java.util.ArrayList;

/**
 * spring中有ordered接口和order注解，用于指定组件有优先级，因此spring提供了OrderComparator比较器来比较两个对象的优先级
 * */
public class OrderComparatorStyle {

	public static void main(String[] args) {
		/**
		 * 该比较的特点：
		 * 1、order越小表示优先级越高，也就是越大
		 * 2、o2比o1大返回1，相等返回0，小于返回-1
		 * 3、OrderComparator并不是纯粹的按order比较，Ordered接口有一个子接口PriorityOrdered，该接口优先级最高
		 * 所以有以下规则：
		 * 实现了PriorityOrdered接口的优先级最高-->实现了Ordered接口的第二-->没有实现Ordered接口最后，实现了相同接口的按getOrder()返回值进行比较。
		 * 如：一个类实现了PriorityOrdered，一个实现了Ordered，那么即使Ordered那个类的order值要小，那么也是PriorityOrdered的优先级最高
		 * 4、未指定order的类(也就是未实现ordered),order默认为Integer类型最大值(也就是最低优先级)
		 * */
		OrderComparator orderComparator = new OrderComparator();
		int compare = orderComparator.compare(new User(), new User1());
		System.out.println(compare);
		int compare1 = orderComparator.compare("new User()", "new User1()");
		System.out.println(compare1);

		// 同时也可以利用其进行排序
		ArrayList<Object> objects = new ArrayList<>();
		objects.add(new User());
		objects.add(new User1());
		objects.add(new User1());
		objects.sort(orderComparator);
		// 这里会将user1排前面，实际上user1是比user优先级高的。之所以会出现这个问题是因为OrderComparator和java中比较器不一样
		// java中比较器是o1 > o2 返回1，而OrderComparator是o1 > o2 返回 -1.所以导致排序时升序变为了倒序
		System.out.println(objects);

		/**
		 * spring还提供了一个OrderComparator的子接口用于支持@order注解的比较
		 * @see org.springframework.core.annotation.AnnotationAwareOrderComparator
		 * 当然，该接口本质是继承OrderComparator，所以一个类如果实现了Ordered、PriorityOrdered接口，那么还是会优先
		 * 拿指定的order，如果没有实现，则取注解指定的order。否则取最低优先级
		 * */
		AnnotationAwareOrderComparator annotationAwareOrderComparator = new AnnotationAwareOrderComparator();
		int compare2 = annotationAwareOrderComparator.compare(new User3(), new User2());
		System.out.println(compare2); // 1
	}

}
